package com.bfly.mall.order.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.bfly.core.base.entity.BaseEntity;
import com.bfly.mall.order.enums.ExpressStatusEnum;
import com.bfly.mall.order.enums.OrderStatusEnum;
import com.bfly.mall.order.enums.PayStatusEnum;
import com.bfly.mall.order.enums.PayTypeEnum;
import com.bfly.mall.user.entity.User;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;

/**
 * 订单
 *
 * @author 长沙商脉科技有限公司
 * @date 2020/9/15 21:10
 */
@TableName(value = "orders", resultMap = "OrderResultMap")
public class Order extends BaseEntity implements Serializable {

    private static final long serialVersionUID = -6188096472836431149L;

    /**
     * 订单号
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/17 20:28
     */
    @TableField("order_no")
    private String orderNo;

    /**
     * 微信支付会话标识有效期2效时
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/5/11 14:53
     */
    @TableField("prepay_id")
    private String prepayId;

    /**
     * 第三方支付返回的交易号
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/17 20:28
     */
    @TableField("trade_no")
    private String tradeNo;

    /**
     * 订单产品总金额
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/17 20:29
     */
    @TableField("pro_price")
    private BigDecimal productPrice;

    /**
     * 订单支付金额 支付金额= 订单产品总金额 + 订单总运费 - 订单优惠金额
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/17 20:29
     */
    @TableField("pay_price")
    private BigDecimal payPrice;

    /**
     * 订单优惠金额
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/17 20:30
     */
    @TableField("discount_price")
    private BigDecimal discountPrice;

    /**
     * 优惠卷ID
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/9/15 21:14
     */
    @TableField("coupon_id")
    private int couponId;

    /**
     * 订单运费金额
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/28 12:22
     */
    @TableField("express_price")
    private BigDecimal expressPrice;

    /**
     * 订单配送类型
     * @see com.bfly.mall.product.enums.ShippingMethodEnum
     * @author 长沙商脉科技有限公司
     * @date 2020/10/9 14:41
     */
    @TableField("dispatch_id")
    private int dispatchId;

    /**
     * 买家ID
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/17 20:32
     */
    @TableField("user_id")
    private int userId;

    @TableField(exist = false)
    private User user;

    /**
     * 订单状态
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/17 20:32
     * @see com.bfly.mall.order.enums.OrderStatusEnum
     */
    @TableField("order_status")
    private int orderStatus;

    /**
     * 支付状态
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/17 21:45
     * @see com.bfly.mall.order.enums.PayStatusEnum
     */
    @TableField("pay_status")
    private int payStatus;

    /**
     * 物流状态
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/17 21:46
     * @see com.bfly.mall.order.enums.ExpressStatusEnum
     */
    @TableField("express_status")
    private int expressStatus;

    /**
     * 付款类型
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/17 20:32
     * @see com.bfly.mall.order.enums.PayTypeEnum
     */
    @TableField("pay_type")
    private int payType;

    /**
     * 活动类型
     * @author 长沙商脉科技有限公司
     * @date 2021/2/2 12:24
     */
    @TableField("activity_type")
    private int activityType;

    /**
     * 活动ID
     * @author 长沙商脉科技有限公司
     * @date 2021/2/2 14:24
     */
    @TableField("activity_id")
    private int activityId;

    /**
     * 订单备注
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/17 20:33
     */
    @TableField("remark")
    private String remark;

    /**
     * 下单Ip
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/23 18:55
     */
    @TableField("create_ip")
    private String createIp;

    /**
     * 订单SKU明细
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/19 21:44
     */
    @TableField(exist = false)
    private List<OrderSku> skus;

    /**
     * 订单收货地址
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/19 21:44
     */
    @TableField(exist = false)
    private OrderAddress address;

    /**
     * 订单物流信息
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/10/4 18:19
     */
    @TableField(exist = false)
    private List<OrderExpress> express;

    /**
     * 订单操作日志
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/10/7 10:54
     */
    @TableField(exist = false)
    private List<OrderLogs> logs;

    /**
     * 是否能做支付操作
     * 顶大打开状态，物流初始状态，未支付状态的订单可做支付操作
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/5/11 12:06
     */
    public boolean isCanPay() {
        return getOrderStatus() == OrderStatusEnum.OPEN.getId() && getExpressStatus() == ExpressStatusEnum.INITIAL.getId() &&
                getPayStatus() == PayStatusEnum.WAIT_PAY.getId();
    }

    /**
     * 是否能做取消操作
     * 订单打开状态，物流初始状态，未支付状态的订单可以取消
     * 订单打开状态，物流待发货状态，支付成功状态的订单可以取消
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/25 14:11
     */
    public boolean isCanCancel() {
        return (getOrderStatus() == OrderStatusEnum.OPEN.getId() && getExpressStatus() == ExpressStatusEnum.INITIAL.getId() && getPayStatus() == PayStatusEnum.WAIT_PAY.getId()) ||
                (getOrderStatus() == OrderStatusEnum.OPEN.getId() && getExpressStatus() == ExpressStatusEnum.WAIT_SHIP.getId() && getPayStatus() == PayStatusEnum.SUCCESS.getId());
    }

    /**
     * 是否能做发货操作
     * 订单打开状态，物流待发货状态，已支付状态的订单可以做发货操作
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/25 14:14
     */
    public boolean isCanShip() {
        return getOrderStatus() == OrderStatusEnum.OPEN.getId() &&
                getPayStatus() == PayStatusEnum.SUCCESS.getId() &&
                getExpressStatus() == ExpressStatusEnum.WAIT_SHIP.getId();
    }

    /**
     * 用户是否能做申请退款操作
     * 订单打开状态，支付成功状态，待发货状态 可以申请退款
     * 订单打开状态，支付成功状态，已发货状态 可以申请退款
     * 订单完成状态，支付成功状态，已收货状态 可以申请退款
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/25 18:12
     */
    public boolean isCanApplyRefund() {
        return (getOrderStatus() == OrderStatusEnum.OPEN.getId() && getPayStatus() == PayStatusEnum.SUCCESS.getId() && getExpressStatus() == ExpressStatusEnum.WAIT_SHIP.getId()) ||
                (getOrderStatus() == OrderStatusEnum.OPEN.getId() && getPayStatus() == PayStatusEnum.SUCCESS.getId() && getExpressStatus() == ExpressStatusEnum.SHIPPING.getId()) ||
                (getOrderStatus() == OrderStatusEnum.COMPLETE.getId() && getPayStatus() == PayStatusEnum.SUCCESS.getId() && getExpressStatus() == ExpressStatusEnum.RECEIVED.getId());
    }

    /**
     * 门店是否能做退款确认操作
     * 订单打开状态，支付待退款状态，待发货状态 可以申请退款
     * 订单打开状态，支付待退款状态，已发货状态 可以申请退款
     * 订单完成状态，支付待退款状态，已收货状态 可以申请退款
     * 订单完成状态，支付待退款状态，商家已收货状态 可以申请退款
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/25 18:31
     */
    public boolean isCanRefund() {
        return (getOrderStatus() == OrderStatusEnum.OPEN.getId() && getPayStatus() == PayStatusEnum.WAIT_REFUND.getId() && getExpressStatus() == ExpressStatusEnum.WAIT_SHIP.getId()) ||
                (getOrderStatus() == OrderStatusEnum.OPEN.getId() && getPayStatus() == PayStatusEnum.WAIT_REFUND.getId() && getExpressStatus() == ExpressStatusEnum.SHIPPING.getId()) ||
                (getOrderStatus() == OrderStatusEnum.COMPLETE.getId() && getPayStatus() == PayStatusEnum.WAIT_REFUND.getId() && getExpressStatus() == ExpressStatusEnum.RECEIVED.getId()) ||
                (getOrderStatus() == OrderStatusEnum.COMPLETE.getId() && getPayStatus() == PayStatusEnum.WAIT_REFUND.getId() && getExpressStatus() == ExpressStatusEnum.RETURN_RECEIVED.getId());
    }

    /**
     * 门店是否能做驳回退款申请操作
     * 订单打开状态，支付待退款状态，待发货状态 可以驳回申请退款
     * 订单打开状态，支付待退款状态，已发货状态 可以驳回申请退款
     * 订单完成状态，支付待退款状态，已收货状态 可以驳回申请退款
     * 订单完成状态，支付待退款状态，商家已收货状态 可以驳回申请退款
     * 订单完成状态，支付待退款状态，商家待收货状态 可以驳回申请退款
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/25 18:55
     */
    public boolean isCanRejectRefund() {
        return isCanRefund() ||
                (getOrderStatus() == OrderStatusEnum.COMPLETE.getId() && getPayStatus() == PayStatusEnum.WAIT_REFUND.getId() && getExpressStatus() == ExpressStatusEnum.RETURN_WAIT_RECEIVE.getId());
    }

    /**
     * 订单是否能被商户已收货操作---退款退货
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/25 19:57
     */
    public boolean isCanConfirmReceiveShopKeeper() {
        return getExpressStatus() == ExpressStatusEnum.RETURN_WAIT_RECEIVE.getId() &&
                getPayStatus() == PayStatusEnum.WAIT_REFUND.getId() &&
                getOrderStatus() == OrderStatusEnum.COMPLETE.getId();
    }

    /**
     * 订单是否可以做确认收货动作---用户手动确认或系统自动确认
     * @author 长沙商脉科技有限公司
     * @date 2020/12/4 18:07
     */
    public boolean isCanConfirmReceive(){
        return getExpressStatus() == ExpressStatusEnum.SHIPPING.getId() &&
                getPayStatus() == PayStatusEnum.SUCCESS.getId() &&
                getOrderStatus() == OrderStatusEnum.OPEN.getId();
    }

    public int getActivityId() {
        return activityId;
    }

    public void setActivityId(int activityId) {
        this.activityId = activityId;
    }

    public int getActivityType() {
        return activityType;
    }

    public void setActivityType(int activityType) {
        this.activityType = activityType;
    }

    public int getDispatchId() {
        return dispatchId;
    }

    public void setDispatchId(int dispatchId) {
        this.dispatchId = dispatchId;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public List<OrderLogs> getLogs() {
        return logs;
    }

    public void setLogs(List<OrderLogs> logs) {
        this.logs = logs;
    }

    public String getPrepayId() {
        return prepayId;
    }

    public void setPrepayId(String prepayId) {
        this.prepayId = prepayId;
    }


    public BigDecimal getExpressPrice() {
        return expressPrice;
    }

    public void setExpressPrice(BigDecimal expressPrice) {
        this.expressPrice = expressPrice;
    }

    public String getCreateIp() {
        return createIp;
    }

    public void setCreateIp(String createIp) {
        this.createIp = createIp;
    }

    public OrderAddress getAddress() {
        return address;
    }

    public void setAddress(OrderAddress address) {
        this.address = address;
    }

    public List<OrderExpress> getExpress() {
        return express;
    }

    public void setExpress(List<OrderExpress> express) {
        this.express = express;
    }

    public String getStatusName() {
        OrderStatusEnum status = OrderStatusEnum.getStatus(getOrderStatus());
        return status == null ? "" : status.getName();
    }

    public String getPayStatusName() {
        PayStatusEnum status = PayStatusEnum.getStatus(getPayStatus());
        return status == null ? "" : status.getName();
    }

    public String getExpressStatusName() {
        ExpressStatusEnum status = ExpressStatusEnum.getStatus(getExpressStatus());
        return status == null ? "" : status.getName();
    }

    public String getPayTypeName() {
        PayTypeEnum type = PayTypeEnum.getStatus(getPayType());
        return type == null ? "" : type.getName();
    }

    public int getCouponId() {
        return couponId;
    }

    public void setCouponId(int couponId) {
        this.couponId = couponId;
    }

    public List<OrderSku> getSkus() {
        return skus;
    }

    public void setSkus(List<OrderSku> skus) {
        this.skus = skus;
    }

    public String getOrderNo() {
        return orderNo;
    }

    public void setOrderNo(String orderNo) {
        this.orderNo = orderNo;
    }

    public String getTradeNo() {
        return tradeNo;
    }

    public void setTradeNo(String tradeNo) {
        this.tradeNo = tradeNo;
    }

    public BigDecimal getProductPrice() {
        return productPrice;
    }

    public void setProductPrice(BigDecimal productPrice) {
        this.productPrice = productPrice;
    }

    public BigDecimal getPayPrice() {
        return payPrice;
    }

    public void setPayPrice(BigDecimal payPrice) {
        this.payPrice = payPrice;
    }

    public BigDecimal getDiscountPrice() {
        return discountPrice;
    }

    public void setDiscountPrice(BigDecimal discountPrice) {
        this.discountPrice = discountPrice;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public int getOrderStatus() {
        return orderStatus;
    }

    public void setOrderStatus(int orderStatus) {
        this.orderStatus = orderStatus;
    }

    public int getPayStatus() {
        return payStatus;
    }

    public void setPayStatus(int payStatus) {
        this.payStatus = payStatus;
    }

    public int getExpressStatus() {
        return expressStatus;
    }

    public void setExpressStatus(int expressStatus) {
        this.expressStatus = expressStatus;
    }

    public int getPayType() {
        return payType;
    }

    public void setPayType(int payType) {
        this.payType = payType;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }
}
